package com.zretc.aop.log;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * 3-> 自定义切面(通用的功能，这个功能可能给sendMessage, Userservice。。。。。。)
 *   使用注解@Aspect来表示
 *  @Component 表示这个类是一个bean,用来代替 <bean id class....>
 * 
 * @author Administrator
 *
 */
@Component
@Aspect
public class LogAop {

	/**
	 * 切面before,前置通知(什么时候执行)的方法;指定了通知类型，和切入点的语法
	 */
	@Before(value="testMethod()")
	public void before() {
		System.out.println("执行之前的输出: " + System.currentTimeMillis());
	}

	/**
	 * 切面after,后置通知(什么时候执行)的方法
	 */
	@After(value="testMethod()")
	public void after() {
		System.out.println("执行之后的输出: " + System.currentTimeMillis());
	}

	/**
	 * 环绕通知
	 * @param pjp
	 * @return
	 * @throws Throwable
	 */
	@Around(value="testMethod()")
	public Object around(ProceedingJoinPoint pjp) throws Throwable {

		System.out.println("around 执行之前的输出: " + System.currentTimeMillis());
		// 调用业务方法
		Object result = pjp.proceed();
		System.out.println("around 执行之后的输出: " + System.currentTimeMillis());

		return result;
	}
	
	@Pointcut(value="execution (* com.zretc.aop.*.*(..))")
	public void testMethod() {
		
	}
}
